iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
DevOps

第一次參賽就學 Kubernetes系列 第 10

[Day 10] Deployment (上篇)

  • 分享至 

  • xImage
  •  

前一篇我們提到 ReplicaSet 來管理 pods。

假使為了讓應用程式 HA 及負載平衡,使用 ReplicaSet 部署 5 個 pods。一切看似沒問題,若之後開發工程師發佈應用程式的第二版,如何使 ReplicaSet 中的 pods 自動更新為 v2?

Deployment

Deployment 用於部署及管理一組 pods(應用服務),提供更新(upgrade)及倒回舊版或稱回滾?(rollback)的功能,讓管理者能更輕易對部署的應用程式進行管理。

Deployment 的功能:

  • 提供 pods HA 與負載平衡
  • 應用服務的版本升級(upgrade),更新策略有:
    • recreate:終止舊版本的 instance 後再建立新版本的 instance
    • rolling update:逐步建立一個新版本的 instance、終止一個舊版本的 instance,不將所有 instances 一次都換成新版,確保程式提供的服務不中斷,目的是提供應用服務 zero downtime (零停機更新)
  • 倒回舊版或稱回滾(rollback),就是回復到之前的程式版本
  • 讓 pods 暫停與重啟的功能,用於觀察更新 pod 的運行,例如進行應用程式的測試與維護

ReplicaSet

在建立 deployment 時,預設會建立一個 replicaset,並依照設定檔中的 replicas 來維持當前所需數量的 pods。

在部署應用程式時,直接透過 deployment 來定義程式需要幾個 replicaspods template 及程式版本更新要如何進行,不需另外去建立 replicaset 與 pod 設定。

Rollout

中文稱為「滾動更新」,滾動更新是一種將應用程式從舊版本更新到新版本的方法,同時確保應用程式的可用性和效能。

建立一個 deployment 時,會觸發 rollout,rollout 會建立一個新的 deployment revision,稱為 Revision 1。當應用程式更新後,新的 rollout 會被觸發、建立一個新的 revision,稱為 Revision 2。Deployment 透過這種機制可以幫助我們去追蹤及倒回之前的版本。

rollout 提供的好處:

  • 將新版本的 pod 逐步部署到叢集中,因此應用程式在更新過程中仍然可以使用
  • 控制新舊版本的 pod 比例,可避免更新過程對應用程式效能造成影響
  • 提供各種控制選項,例如更新速率、回滾閾值等,根據需要來調整 rollout 的行為

範例

接下來進行的操作有:

  1. 建立 deployment
  2. 進行 upgrade
  3. 進行 rollback
  4. 刪除 deployment

底下為 nginx-deploy.yaml,deployment 與 replicaset 差別在於 kind: Deployment,其他內容幾乎相同。

replicas 設定為 3,並透過 labels: 中的 app:my-app 來連結 pods。一樣是用 nginx 來作為 image。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: nginx
        image: nginx:1.20.0
        ports:
        - containerPort: 80

1. 建立 deployment

kubectl apply -f nginx-deploy.yaml

deployment.apps/nginx-deploy created

查看 deployment。

kubectl get deploy nginx-deploy

NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   3/3     3            3           47s

查看 deployment 建立的 replicaset 與 pods。

kubectl get rs

NAME                      DESIRED   CURRENT   READY   AGE
nginx-deploy-65b6d5d9d9   3         3         3       59s
kubectl get po

NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-65b6d5d9d9-4qhdq   1/1     Running   0          71s
nginx-deploy-65b6d5d9d9-nlwx6   1/1     Running   0          71s
nginx-deploy-65b6d5d9d9-pzr85   1/1     Running   0          71s

使用 kubectl describe 觀察 deployment,可以看到 StrategyType 預設為 RollingUpdate,及 Events 裡的 Scaled up replica set 事件。

kubectl describe deploy nginx-deploy

Name:                   nginx-deploy
Namespace:              default
CreationTimestamp:      Mon, 25 Sep 2023 23:18:13 +0800
Labels:                 app=my-app
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=my-app
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=my-app
  Containers:
   nginx:
    Image:        nginx:1.20.0
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deploy-65b6d5d9d9 (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  82s   deployment-controller  Scaled up replica set nginx-deploy-65b6d5d9d9 to 3

下一篇則接續 upgrade、rollback 與刪除 deployment 的操作。


上一篇
[Day 09] ReplicaSet
下一篇
[Day 11] Deployment (下篇)
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言